package Day023_设计模式_动态代理.demo4_动态代理;

/**
 * @author zhangyan
 * @date 2020/5/17 11:10
 */
/*
    静态代理:代理类真实存在,通过代理类产生代理对象(类似装饰者模式)
    动态代理:代理类不是真实存在的(被代理类要实现接口)
    动态代理可以对被代理对象的方法进行增强，可以在不修改方法源码的情况下，增强被代理对象方法的功能，在方法执行前后做任何你想做的事情

    java.lang.reflect.Proxy：
                        这是 Java 动态代理机制的主类，它提供了一个静态方法来为一组接口的实现类动态地生成代理类及其对象

    public static Object newProxyInstance(ClassLoader loader, Class[] interfaces,InvocationHandler h)
                参数1 loader: 被代理类的类加载器
                参数2 interfaces: 被代理类所有实现的借口的class对象
                参数3 InvocationHandler: 执行处理类
                前两个参数是为了帮助在jvm内部生成被代理类的代理对象, 第三个参数是为了监听代理对象调用的方法,帮助我们代理对象调用方法

    newProxyInstance方法的三个参数的详解:该方法用于为指定类装载器、一组接口及调用处理器生成动态代理类实例:
               1、obj.getClass().getClassLoader()目标对象通过getClass方法获取类的所有信息后，调用getClassLoader() 方法来获取类加载器
                  获取类加载器后，可以通过这个类型的加载器，在程序运行时，将生成的代理类加载到JVM即Java虚拟机中，以便运行时需要！
               2、obj.getClass().getInterfaces()获取被代理类的所有接口信息，以便于生成的代理类可以具有代理类接口中的所有方法。
               3、InvocationHandler 这是调用处理器接口，它自定义了一个 invoke 方法，用于集中处理在动态代理类对象上的方法调用，
                  通常在该方法中实现对委托类方法的处理以及访问.
                        InvocationHandler接口的invoke方法及参数详解:
                            public Object invoke(Object proxy, Method method, Object[] args)
                                1、Object proxy: 方法内部创建的代理人对象。
                                2、Method method：方法内部会使用反射技术,自动被代理人使用的方法。
                                3、Object[] args：被代理方法中的参数。这里因为参数个数不定，所以用一个对象数组来表示
 */
public class Test {
    //动态代理:代理类不是真实存在的,但一定实现了被代理类的借口
}
